package com.example.springstudy.configration;

import com.example.springstudy.entity.UsersRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 *
 *对shiro进行配置
 * */
@Configuration
public class ShiroConfig {
    /**
     * 创建shiroFilterFactoryBean
     */
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("SecurityManager")DefaultWebSecurityManager defaultWebSecurityManager ) {
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        /**注册安全管理器到工厂中*/
        filterFactoryBean.setSecurityManager(defaultWebSecurityManager);
        /**
         * Shiro内置过滤器：可以实现权限相关的拦截
         *  常用的过滤器
         *      anon: 无需认证登录就可以进行访问
         *      authc: 必须认证才可以进行访问
         *      user: 使用rememberMe这个功能可以进行直接访问
         *      perms: 该资源必需授权才可以进行访问
         *      role: 必循得到角色权限才可以进行访问
         *  */
        Map<String, String> filterMap = new HashMap<>();
        /*对地址/add中的这一地址下进行拦截*/
        /*对地址/add/* 中的这一地址下所有进行拦截,具体拦截的做法会跳到Realm当
        中的doGetAuthorizationInfo，的这个方法来具体的实现*/

        filterMap.put("/add", "authc");

        /*资源授权拦截器,当授权拦截后会自动跳去到一个未授权的页面*/
        filterMap.put("/delete", "perms[user:add]");



        /*把拦截配置传入到bean中*/
        filterFactoryBean.setFilterChainDefinitionMap(filterMap);
        /**拦截后默认跳去到/login.jsp 这个地址 使用.setLoginUrl 来进行配置*/
        filterFactoryBean.setLoginUrl("/log.html");
        /*设置未授权的页面*/
        filterFactoryBean.setUnauthorizedUrl("/unauthorized.html");
        return filterFactoryBean;
    }

    /*
     * 创建DefaultWebSecurityManger (对应shiro安全管理器)
     * */
    @Bean(name = "SecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("UsersRealm") UsersRealm usersRealm) {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(usersRealm);
        return defaultWebSecurityManager;
    }
    /**
     * 创建Realm
     */
    @Bean(name = "UsersRealm")
    public  UsersRealm getRealm() {
        return new UsersRealm();
    }
}
